#include <iostream>
#include <vector>
#include <string.h>
#define _  ios_base::sync_with_stdio(0),cin.tie(0)
using namespace std;
struct Edge{
	int to;
	int val;
}edge; 
const int INF=0x7fffffff;
const int maxn=1e3+5;
vector<Edge> mp[maxn];
int dis[maxn];
bool vis[maxn];
int n,m;
void dijkstra(int start){
	fill(dis,dis+n+1,INF);//1����ʼ�����е����·����Ϊ�����㵽���е��Ŀǰ��������� 
	memset(vis,false,sizeof(vis));
	//�ڵ�ı��Ϊ1----n 
	dis[start]=0;//2���Լ����Լ��ľ���Ϊ0 
	while(1){
		int top=-1;//û���ҵ����ʵĶ��� 
		int min_val=INF,min_index=-1;
		for(int i=1;i<=n;i++){
			if(!vis[i]&&min_val>dis[i]){
				min_val=dis[i];//��СȨֵ��Ϊ������СȨֵ��Ӧ�Ķ����� 
				min_index=i;//���涥���� 
			}
		} 
		top=min_index;
		if(top==-1) return ;
		vis[top]=true;
		for(int i=0;i<mp[top].size();i++){
			edge=mp[top][i];
			if(dis[top]+edge.val < dis[edge.to]){
				dis[edge.to]=dis[top]+edge.val;
			}
		}//3���ɳڲ��� 
	}
}
int main(){
	int s,t;
	while(cin>>n>>m>>s>>t){
		for(int i=0;i<=n;i++)
		mp[i].clear();
		while(m--){
			int u,v,val;
			cin>>u>>v>>val;
			edge.to=v;
			edge.val=val;
			mp[u].push_back(edge);
			edge.to=u;
			mp[v].push_back(edge);
		}//��ͼ 
//		dijkstra;�Ͻ�˹���� 
		dijkstra(s);
//		dis[t] INF  <INF
//		for(int i=0;i<n;i++){
//			cout<<dis[i]<<" ";
//		}
//		cout<<endl;
		if(dis[t]==INF){
			cout<<-1<<endl;
		}else{
			cout<<dis[t]<<endl;
		}
	}
	return 0;
}
//5 8
//0 1 5
//0 2 2
//0 3 6
//2 1 1
//2 4 5
//2 3 3
//1 4 1
//3 4 2


